home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
PROGRAMM
/
PASCAL
/
1463.ZIP
/
DRAW-2D.ARC
/
GRMAT.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1986-10-29
|
4KB
|
147 lines
PROCEDURE INITSTK;
VAR
I,J:INTEGER;
XWRAT,YWRAT,XWSHFT,YWSHFT:REAL;
BEGIN
FOR I := 1 TO 3 DO
FOR J := 1 TO 3 DO
CLRMAT[I,J] := 0.0;
IDMAT := CLRMAT;
FOR I := 1 TO 3 DO
IDMAT[I,I] := 1.0;
ROTMAT := CLRMAT;
SCALEMAT := CLRMAT;
TRANSMAT := CLRMAT;
WORLDMAT := IDMAT;
XWRAT := (XVMAX-XVMIN)/(XWMAX-XWMIN);
YWRAT := (YVMAX-YVMIN)/(YWMAX-YWMIN);
XWSHFT := XVMIN - (XWMIN*XWRAT);
YWSHFT := YVMIN - (YWMIN*YWRAT);
WORLDMAT[1,1] := XWRAT;
WORLDMAT[2,2] := YWRAT;
WORLDMAT[3,1] := XWSHFT;
WORLDMAT[3,2] := YWSHFT;
TEMPMAT := CLRMAT;
FOR I := 1 TO 10 DO
STKMAT[I] := CLRMAT;
STKMAT[1] := WORLDMAT;
STKPTR := 2;
END;
PROCEDURE MULMAT(A,B:MATRIX; VAR C:MATRIX);
VAR
I,J,K:INTEGER;
BEGIN
TEMPMAT := CLRMAT;
FOR I := 1 TO 3 DO
FOR K := 1 TO 3 DO
FOR J := 1 TO 3 DO
TEMPMAT[I,K] := TEMPMAT[I,K] + A[I,J]*B[J,K];
C := TEMPMAT;
END;
PROCEDURE MULVEC(VAR V:VECTOR; A:MATRIX);
VAR
J,K:INTEGER;
P:VECTOR;
BEGIN
FOR K := 1 TO 3 DO
BEGIN
P[K] := 0.0;
FOR J := 1 TO 3 DO
P[K] := P[K] + V[J]*A[J,K];
END;
IF P[3] = 0 THEN
BEGIN
P[1] := XDMAX;
P[2] := YDMAX;
P[3] := 1.0;
END
ELSE
BEGIN
P[1] := P[1]/P[3];
P[2] := P[2]/P[3];
P[3] := 1.0;
END;
V := P;
END;
PROCEDURE PUSHID(VAR CODE:INTEGER);
BEGIN
CODE := 0;
IF STKPTR < 11 THEN
BEGIN
STKMAT[STKPTR] := IDMAT;
STKPTR := STKPTR + 1;
END
ELSE
CODE := 1; (* NO ROOM TO PUSH *)
END;
PROCEDURE POPMAT(VAR CODE:INTEGER);
BEGIN
CODE := 0;
IF STKPTR > 1 THEN
BEGIN
STKMAT[STKPTR] := CLRMAT;
STKPTR := STKPTR - 1;
END
ELSE
CODE := 1; (* NOTHING TO POP *)
END;
PROCEDURE TRANSLAT(DELTX,DELTY:REAL; VAR CODE:INTEGER);
BEGIN
CODE := 0;
IF STKPTR > 1 THEN
BEGIN
TRANSMAT := IDMAT;
TRANSMAT[3,1] := DELTX;
TRANSMAT[3,2] := DELTY;
MULMAT(STKMAT[STKPTR-1],TRANSMAT,STKMAT[STKPTR-1]);
END
ELSE
CODE := 1; (* NOTHING TO TRANSLATE *)
END;
PROCEDURE ROTATE(THETA:REAL; VAR CODE:INTEGER);
BEGIN
CODE := 0;
IF STKPTR > 1 THEN
BEGIN
ROTMAT := IDMAT;
ROTMAT[1,1] := COS(THETA);
ROTMAT[1,2] := SIN(THETA);
ROTMAT[2,1] := -SIN(THETA);
ROTMAT[2,2] := COS(THETA);
MULMAT(STKMAT[STKPTR-1],ROTMAT,STKMAT[STKPTR-1]);
END
ELSE
CODE := 1; (* NOTHING TO ROTATE *)
END;
PROCEDURE SCALE(XFACT,YFACT:REAL; VAR CODE:INTEGER);
BEGIN
CODE := 0;
IF STKPTR > 1 THEN
BEGIN
SCALEMAT := IDMAT;
SCALEMAT[1,1] := XFACT;
SCALEMAT[2,2] := YFACT;
MULMAT(STKMAT[STKPTR-1],SCALEMAT,STKMAT[STKPTR-1]);
END
ELSE
CODE := 1; (* NOTHING TO SCALE *)
END;
PROCEDURE MERGE(VAR CODE:INTEGER);
BEGIN
CODE := 0;
IF STKPTR > 2 THEN
MULMAT(STKMAT[STKPTR-1],STKMAT[STKPTR-2],STKMAT[STKPTR-1])
ELSE CODE := 1; (* NOTHING TO MERGE *)
END;
PROCEDURE MODVEC(VAR XX,YY:REAL; A:MATRIX);
VAR
V:VECTOR;
BEGIN
V[1] := XX;
V[2] := YY;
V[3] := 1.0;
MULVEC(V,A);
XX := V[1];
YY := V[2];
END;